UNPKG

14.9 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../source/require hacker.js"],"names":[],"mappings":"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","file":"require hacker.js","sourcesContent":["// Hacking too much time\r\n\r\n// Based on Node.js Module class sources:\r\n// https://github.com/nodejs/node/blob/master/lib/module.js\r\n\r\nimport fs from 'fs'\r\nimport path from 'path'\r\nimport Module from 'module'\r\n\r\nimport Log from './tools/log'\r\nimport { exists, ends_with } from './helpers'\r\n\r\nimport serialize from './tools/serialize-javascript'\r\n\r\nconst original_findPath = Module._findPath\r\n\r\nexport default class Require_hacker\r\n{\r\n\tpreceding_abstract_path_resolvers = []\r\n\tabstract_path_resolvers = []\r\n\t\r\n\t// original_loaders = {}\r\n\r\n\tabstract_path_resolved_modules = {}\r\n\r\n\tconstructor(options)\r\n\t{\r\n\t\t// // take the passed in options\r\n\t\t// this.options = clone(options)\r\n\r\n\t\t// logging\r\n\t\tthis.log = new Log('require-hook', { debug: options.debug }) // this.options.debug\r\n\r\n\t\t// instrument Module._findPath\r\n\t\t// https://github.com/nodejs/node/blob/master/lib/module.js#L335-L341\r\n\t\tModule._findPath = (...parameters) =>\r\n\t\t{\r\n\t\t\tconst request = parameters[0]\r\n\t\t\t// const paths = parameters[1]\r\n\r\n\t\t\t// preceeding resolvers\r\n\t\t\tfor (let resolver of this.preceding_abstract_path_resolvers)\r\n\t\t\t{\r\n\t\t\t\tconst resolved = resolver.resolve(request)\r\n\t\t\t\tif (typeof resolved !== 'undefined')\r\n\t\t\t\t{\r\n\t\t\t\t\treturn resolved\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// original Node.js loader\r\n\t\t\tconst filename = original_findPath.apply(undefined, parameters)\r\n\t\t\tif (filename !== false)\r\n\t\t\t{\r\n\t\t\t\treturn filename\r\n\t\t\t}\r\n\r\n\t\t\t// rest resolvers\r\n\t\t\tfor (let resolver of this.abstract_path_resolvers)\r\n\t\t\t{\r\n\t\t\t\tconst resolved = resolver.resolve(request)\r\n\t\t\t\tif (typeof resolved !== 'undefined')\r\n\t\t\t\t{\r\n\t\t\t\t\treturn resolved\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn false\r\n\t\t}\r\n\t}\r\n\r\n\t// installs a require() hook for paths \r\n\t// which don't exist in the filesystem\r\n\t//\r\n\t// (if these paths exist in the filesystem\r\n\t// then use the .hook(extension, resolve) method instead)\r\n\t//\r\n\t// id - a meaningful textual identifier\r\n\t//\r\n\t// resolver - a function which takes two parameters:\r\n\t//\r\n\t// the path to be resolved\r\n\t//\r\n\t// a function which flushes require() cache for this path\r\n\t// with no parameters\r\n\t//\r\n\t// must return a javascript CommonJS module source code\r\n\t// (i.e. \"module.exports = ...\", etc)\r\n\t//\r\n\t// returns an object with an .undo() method\r\n\t//\r\n\tglobal_hook(id, resolver, options = {})\r\n\t{\r\n\t\tvalidate.global_hook(id, resolver)\r\n\r\n\t\tconst resolver_entry = \r\n\t\t{\r\n\t\t\tid,\r\n\t\t\tresolve: path =>\r\n\t\t\t{\r\n\t\t\t\tconst resolved_path = `${path}.${id}`\r\n\t\t\t\t\r\n\t\t\t\t// CommonJS module source code\r\n\t\t\t\tconst source = resolver(path)\r\n\t\t\t\t\r\n\t\t\t\tif (!exists(source))\r\n\t\t\t\t{\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// const flush_cache = () => delete require.cache[resolved_path]\r\n\t\t\t\tdelete require.cache[resolved_path]\r\n\r\n\t\t\t\tthis.abstract_path_resolved_modules[resolved_path] = source\r\n\r\n\t\t\t\treturn resolved_path\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (options.precede_node_loader)\r\n\t\t{\r\n\t\t\tthis.preceding_abstract_path_resolvers.push(resolver_entry)\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.abstract_path_resolvers.push(resolver_entry)\r\n\t\t}\r\n\r\n\t\tconst hook = this.hook(id, path => \r\n\t\t{\r\n\t\t\tconst source = this.abstract_path_resolved_modules[path]\r\n\t\t\tdelete this.abstract_path_resolved_modules[path]\r\n\t\t\treturn source\r\n\t\t})\r\n\r\n\t\tconst result =\r\n\t\t{\r\n\t\t\tunmount: () =>\r\n\t\t\t{\r\n\t\t\t\t// javascript arrays still have no .remove() method in the XXI-st century\r\n\t\t\t\tthis.preceding_abstract_path_resolvers = this.preceding_abstract_path_resolvers.filter(x => x !== resolver_entry)\r\n\t\t\t\tthis.abstract_path_resolvers = this.abstract_path_resolvers.filter(x => x !== resolver_entry)\r\n\t\t\t\thook.unmount()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result\r\n\t}\r\n\r\n\t// installs a require() hook for the extension\r\n\t//\r\n\t// extension - a file extension to hook into require()s of\r\n\t// (examples: 'css', 'jpg', 'js')\r\n\t//\r\n\t// resolve - a function that takes two parameters: \r\n\t//\r\n\t// the path requested in the require() call \r\n\t//\r\n\t// and a fallback function (fall back to default behaviour)\r\n\t// with no parameters\r\n\t//\r\n\t// must return a javascript CommonJS module source code\r\n\t// (i.e. \"module.exports = ...\", etc)\r\n\t//\r\n\thook(extension, resolve)\r\n\t{\r\n\t\tthis.log.debug(`Hooking into *.${extension} files loading`)\r\n\t\t\r\n\t\t// validation\r\n\t\tvalidate.extension(extension)\r\n\t\tvalidate.resolve(resolve)\r\n\r\n\t\t// dotted extension\r\n\t\tconst dot_extension = `.${extension}`\r\n\r\n\t\t// keep original extension loader\r\n\t\tconst original_loader = Module._extensions[dot_extension]\r\n\r\n\t\t// display a warning in case of extension loader override\r\n\t\tif (original_loader)\r\n\t\t{\r\n\t\t\t// output a debug message in case of extension loader override,\r\n\t\t\t// not a warning, so that it doesn't scare people\r\n\t\t\tthis.log.debug(`-----------------------------------------------`)\r\n\t\t\tthis.log.debug(`Overriding an already existing require() hook `)\r\n\t\t\tthis.log.debug(`for file extension ${dot_extension}`)\r\n\t\t\tthis.log.debug(`-----------------------------------------------`)\r\n\t\t}\r\n\r\n\t\t// the list of cached modules\r\n\t\tconst cached_modules = new Set()\r\n\r\n\t\t// set new loader for this extension\r\n\t\tModule._extensions[dot_extension] = (module, filename) =>\r\n\t\t{\r\n\t\t\tthis.log.debug(`Loading source code for ${filename}`)\r\n\r\n\t\t\t// fallback flag\r\n\t\t\tlet aborted = false\r\n\r\n\t\t\t// var source = fs.readFileSync(filename, 'utf8')\r\n\t\t\tconst source = resolve(filename, () =>\r\n\t\t\t{\r\n\t\t\t\tthis.log.debug(`Fallback to original loader`)\r\n\r\n\t\t\t\t// fallen back\r\n\t\t\t\taborted = true\r\n\r\n\t\t\t\t// this message would appear if there was no loader \r\n\t\t\t\t// for the extension of the filename\r\n\t\t\t\tif (path.extname(filename) !== dot_extension)\r\n\t\t\t\t{\r\n\t\t\t\t\tthis.log.info(`Trying to load \"${path.basename(filename)}\" as a \"*${dot_extension}\"`)\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// load the file with the original loader\r\n\t\t\t\t(original_loader || Module._extensions['.js'])(module, filename)\r\n\t\t\t})\r\n\r\n\t\t\t// if fallen back - exit\r\n\t\t\tif (aborted)\r\n\t\t\t{\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// add this file path to the list of cached modules\r\n\t\t\tcached_modules.add(filename)\r\n\r\n\t\t\t// compile javascript module from its source\r\n\t\t\t// https://github.com/nodejs/node/blob/master/lib/module.js#L379\r\n\t\t\tmodule._compile(source, filename)\r\n\t\t}\r\n\r\n\t\tconst result = \r\n\t\t{\r\n\t\t\t// uninstall the hook\r\n\t\t\tunmount: () =>\r\n\t\t\t{\r\n\t\t\t\t// clear require() cache for this file extension\r\n\t\t\t\tfor (let path of cached_modules)\r\n\t\t\t\t{\r\n\t\t\t\t\tdelete require.cache[path]\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// mount the original loader for this file extension\r\n\t\t\t\tModule._extensions[dot_extension] = original_loader\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result\r\n\t}\r\n\r\n\t// // uninstalls a previously installed require() hook for the extension\r\n\t// //\r\n\t// // extension - the file extension for which to uninstall \r\n\t// // the previously installed require() hook\r\n\t// //\r\n\t// unhook(extension)\r\n\t// {\r\n\t// \tthis.log.debug(`Unhooking from .${extension} files loading`)\r\n\t//\r\n\t// \t// validation\r\n\t// \tvalidate.extension(extension)\r\n\t//\r\n\t// \t// dotted extension\r\n\t// \tconst dot_extension = `.${extension}`\r\n\t//\r\n\t// \t// verify that the hook exists in the first place\r\n\t// \tif (Object.keys(this.original_loaders).indexOf(dot_extension) < 0)\r\n\t// \t{\r\n\t// \t\tthrow new Error(`Require() hook wasn't previously installed for ${dot_extension} files`)\r\n\t// \t}\r\n\t//\r\n\t// \t// uninstall the hook\r\n\t// \tModule._extensions[dot_extension] = this.original_loaders[dot_extension]\r\n\t// \tdelete this.original_loaders[dot_extension]\r\n\t// }\r\n}\r\n\r\n// validation\r\nconst validate =\r\n{\r\n\textension(extension)\r\n\t{\r\n\t\t// if (typeof extension !== 'string')\r\n\t\t// {\r\n\t\t// \tthrow new Error(`Expected string extension. Got ${extension}`)\r\n\t\t// }\r\n\r\n\t\tif (path.extname(`test.${extension}`) !== `.${extension}`)\r\n\t\t{\r\n\t\t\tthrow new Error(`Invalid file extension ${extension}`)\r\n\t\t}\r\n\t},\r\n\r\n\tresolve(resolve)\r\n\t{\r\n\t\tif (typeof resolve !== 'function')\r\n\t\t{\r\n\t\t\tthrow new Error(`Resolve should be a function. Got ${resolve}`)\r\n\t\t}\r\n\t},\r\n\r\n\tglobal_hook(id, resolver)\r\n\t{\r\n\t\tif (!id)\r\n\t\t{\r\n\t\t\tthrow new Error(`You must specify global hook id`)\r\n\t\t}\r\n\r\n\t\tif (path.extname(`test.${id}`) !== `.${id}`)\r\n\t\t{\r\n\t\t\tthrow new Error(`Invalid global hook id. Expected a valid file extension.`)\r\n\t\t}\r\n\r\n\t\tvalidate.resolve(resolver)\r\n\t}\r\n}\r\n\r\n// returns a CommonJS modules source.\r\nRequire_hacker.to_javascript_module_source = function(anything)\r\n{\r\n\t// if the asset source wasn't found - return an empty CommonJS module\r\n\tif (!exists(anything))\r\n\t{\r\n\t\treturn 'module.exports = undefined'\r\n\t}\r\n\r\n\t// if it's already a common js module source\r\n\tif (typeof anything === 'string' && is_a_module_declaration(anything))\r\n\t{\r\n\t\treturn anything\r\n\t}\r\n\r\n\t// generate javascript module source code based on the `source` variable\r\n\treturn 'module.exports = ' + serialize(anything)\r\n}\r\n\r\n// detect if it is a CommonJS module declaration\r\nfunction is_a_module_declaration(text)\r\n{\r\n\treturn text.indexOf('module.exports = ') === 0 ||\r\n\t\t/\\s+module\\.exports = .+/.test(text)\r\n}"]}
\No newline at end of file